package com.qingcloud.fexecutor.base.utils;

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.util.Collection;
import java.util.List;

/**
 * 导出Excel文档工具类简单版
 *
 * @author 王金楠
 */
@Slf4j
public class SimpleExcelUtil {

    /**
     * 生成文件上级目录
     */
    private static final String PARENT_PATH = "report";

    private SimpleExcelUtil() {
    }

    /**
     * 生成excel文件，返回下载路径
     *
     * @param fileName        下载的文件名称
     * @param headerNameArray 表头数组
     * @param fieldNameArray  对象字段名称，要和表头数组一一对应
     * @param dataList        数据对象列表
     * @return 文件下载根路径
     */
    public static String writeToFile(String rootPath, String fileName, Collection<?> dataList) {
        //文件后缀修正
        if (!fileName.endsWith("xlsx")) {
            fileName = fileName + ".xlsx";
        }
        //完整路径
        String targetFile = rootPath + File.separator + PARENT_PATH + File.separator + fileName;
        //创建xlsx格式
        try (ExcelWriter writer = ExcelUtil.getBigWriter(targetFile)) {
            writer.renameSheet(0, "data");
            //写入数据
            writer.write(dataList, true);
            return PARENT_PATH + "/" + fileName;
        }
    }

    /**
     * 生成excel文件，返回下载路径
     *
     * @param fileName        下载的文件名称
     * @param headerNameArray 表头数组
     * @param fieldNameArray  对象字段名称，要和表头数组一一对应
     * @param dataList        数据对象列表
     * @return 文件下载根路径
     */
    public static String writeToFile(String rootPath, String fileName, List<String> headerNameArray,
                                     List<String> fieldNameArray, Collection<?> dataList) {
        //文件后缀修正
        if (!fileName.endsWith("xlsx")) {
            fileName = fileName + ".xlsx";
        }
        //完整路径
        String targetFile = rootPath + File.separator + PARENT_PATH + File.separator + fileName;
        //创建xlsx格式
        try (ExcelWriter writer = ExcelUtil.getBigWriter(targetFile)) {
            writer.renameSheet(0, "data");
            //设置标题别名
            for (int i = 0; i < headerNameArray.size(); i++) {
                writer.addHeaderAlias(fieldNameArray.get(i), headerNameArray.get(i));
            }
            //只写设置了别名的字段
            writer.setOnlyAlias(true);
            //写入数据
            writer.write(dataList, true);
            return PARENT_PATH + "/" + fileName;
        }
    }

}